package com.kdg.proxy;

/**
 * 代理模式一    静态代理
 * Created by kong on 2018/5/25.
 */
public class StaticProxy {

    public static void main(String[] args) {
        //执行静态代理
        UserDaoImpl userDao = new UserDaoImpl();
        System.out.println(userDao.getClass());
        IUserDao user = new UserProxy(userDao);
        System.out.println(user.getClass());
        user.save();
        /**
         * 静态代理优点：可以在不改变原有对象的前提下进行功能扩展
         * 缺点： 代理对象需要和目标对象实现共同的接口，所以会有太多的类，
         *         并且一旦父接口增加或修改方法所有的目标对象和代理对象都会改变
         */
    }
}

/**
 * 接口
 */
interface IUserDao{
    void save();
    void select();
}

/**
 * 目标对象
 */
class UserDaoImpl implements  IUserDao{

    @Override
    public void save() {
        System.out.println("---------已经保存数据----------");
    }

    @Override
    public void select() {
        System.out.println("------经查询数据后发现，地球is going to die-------");
    }
}

/**
 * 代理对象  --静态代理
 */
class UserProxy implements IUserDao{

    private IUserDao target;

    public UserProxy(IUserDao iUserDao) {
        this.target = iUserDao;
    }

    @Override
    public void save() {
        System.out.println("-------代理执行开始-------");
        target.save();
        System.out.println("--------代理执行结束-------");
    }

    @Override
    public void select() {
        System.out.println("-------代理执行开始-------");
        target.select();
        System.out.println("--------代理执行结束-------");
    }
}